package com.gopay.common.user.manager.impl;

import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;

import com.gopay.common.domain.dc.DcUserCardInfo;
import com.gopay.common.user.dao.UserDCInfoDAO;
import com.gopay.common.user.dao.UserInfoQueryDAO;
import com.gopay.common.user.manager.UserDcPwdManager;
import com.gopay.common.util.DCUtil;

@Service("userDcPwdManager")
public class UserDcPwdManagerImpl implements UserDcPwdManager {

	private Logger logger = Logger.getLogger(getClass());
	
	@Resource(name = "userDCInfoDAO")
	private UserDCInfoDAO userDCInfoDAO;

	@Override
		public boolean getDCAuth(String custId) {
			// TODO Auto-generated method stub
			List list = userDCInfoDAO.getDcAuth(custId);
			if (list == null || list.size() == 0) {
				return false;
			} else {
				return true;
			}

	}

	@Override
	public boolean getDCAuthbyUserId(String userId) {
		// TODO Auto-generated method stub
		List list = userDCInfoDAO.getDcAuthByUserId(userId);
		if (list == null || list.size() == 0) {
			return false;
		} else {
			return true;
		}
	}

	@Override
	public int getErrNum(String custId) {
		// TODO Auto-generated method stub

		int num = userDCInfoDAO.getErrNum(custId);

		return num;
	}

	@Override
	public String getErrMesg(String custId, String dcPass) throws Exception {
		// TODO Auto-generated method stub
		String errMesg = "";
		if("".equals(dcPass)||dcPass==null){
			errMesg ="动态口令不能为空";
			return errMesg;
		}
		// 获取用户绑定启用的有效信息
		List<DcUserCardInfo> list = userDCInfoDAO.getDcAuth(custId);
		DcUserCardInfo du = new DcUserCardInfo();
		if (list != null && list.size() > 0) {
			du = list.get(0);
		}
		if(StringUtils.isBlank(du.getTokenErrorNum())){
			du.setTokenErrorNum("0");
		}
		// 首先判断是不是手动锁定
		String handleLock = du.getConsoleLockStat();
		String pwdLock = du.getPwdLockStat();
		if ("1".equals(handleLock)) {
			errMesg = "动态口令密码已被锁定，请与国付宝客服人员联系，解锁动态口令。客服电话：400-0550-009";
			return errMesg;
		} else if ("1".equals(pwdLock)) {// 输错5次的锁定状态
			errMesg = "动态口令错误，连续错误5次（连续错误次数等于5次时，动态口令将被锁定） 请与国付宝客服人员联系，解锁动态口令。客服电话：400-0550-009";
			return errMesg;
		} else {// 动态口令没有被锁
			Map map = DCUtil.CheckDynamicPwdByToken(du.getTokenId(), dcPass);
			String retCode = (String) map.get("retCode");
			String retdesc = (String) map.get("retdesc");
			logger.info("客户ID="+custId+"动态口令返回的信息retCode="+retCode+"返回信息"+retdesc);
			// 0--表示成功，否则失败
			if ("0".equals(retCode)) {
				// 成功了，将TOKEN_ERROR_NUM密码输入错误次数清零
				//先判断下TOKEN_ERROR_NUM是不是0，是0就不用管了
				String TOKEN_ERROR_NUM=du.getTokenErrorNum();
				if(!"0".equals(TOKEN_ERROR_NUM)){
					du.setTokenErrorNum("0");
					userDCInfoDAO.update(du);
				}
				
				
			} else {
				// 今天的错误次数
				int num = Integer.parseInt(du.getTokenErrorNum());
				if (num < 4) {
					errMesg = "动态口令错误，连续错误"+(num+1)+"次（连续错误次数等于5次时，动态口令将被锁定）";

				} else if (num == 4) {
					// 这是第5次，要锁定了，还要修改控制台的锁定状态
					errMesg = "动态口令错误，连续错误5次（连续错误次数等于5次时，动态口令将被锁定） 请与国付宝客服人员联系，解锁动态口令。客服电话：400-0550-009";
					// 锁住动态口令，因为密码输错5次
					du.setPwdLockStat("1");
				}
				// 更新次数+1
				du.setTokenErrorNum(String.valueOf(num + 1));
				userDCInfoDAO.update(du);
			}

		}

		return errMesg;
	}

	@Override
	public String getErrMesgByUserId(String userId, String dcPass) throws Exception {
		// TODO Auto-generated method stub
		String errMesg = "";
		if("".equals(dcPass)||dcPass==null){
			errMesg ="动态口令不能为空";
			return errMesg;
		}
		// 获取用户绑定启用的有效信息
		List<DcUserCardInfo> list = userDCInfoDAO.getDcAuthByUserId(userId);
		DcUserCardInfo du = new DcUserCardInfo();
		if (list != null && list.size() > 0) {
			du = list.get(0);
		}
		if(StringUtils.isBlank(du.getTokenErrorNum())){
			du.setTokenErrorNum("0");
		}
		// 首先判断是不是手动锁定
		String handleLock = du.getConsoleLockStat();
		String pwdLock = du.getPwdLockStat();
		if ("1".equals(handleLock)) {
			errMesg = "动态口令密码已被锁定，请与国付宝客服人员联系，解锁动态口令。客服电话：400-0550-009";
			return errMesg;
		} else if ("1".equals(pwdLock)) {// 输错5次的锁定状态
			errMesg = "动态口令错误，连续错误5次（连续错误次数等于5次时，动态口令将被锁定） 请与国付宝客服人员联系，解锁动态口令。客服电话：400-0550-009";
			return errMesg;
		} else {// 动态口令没有被锁
			Map map = DCUtil.CheckDynamicPwdByToken(du.getTokenId(), dcPass);
			String retCode = (String) map.get("retCode");
			String retdesc = (String) map.get("retdesc");
			logger.info("用户ID="+userId+"动态口令返回的信息retCode="+retCode+"返回信息"+retdesc);
			// 0--表示成功，否则失败
			if ("0".equals(retCode)) {
				// 成功了，将TOKEN_ERROR_NUM密码输入错误次数清零
				//先判断下TOKEN_ERROR_NUM是不是0，是0就不用管了
				String TOKEN_ERROR_NUM=du.getTokenErrorNum();
				if(!"0".equals(TOKEN_ERROR_NUM)){
					du.setTokenErrorNum("0");
					userDCInfoDAO.update(du);
				}


			} else {
				// 今天的错误次数
				int num = Integer.parseInt(du.getTokenErrorNum());
				if (num < 4) {
					errMesg = "动态口令错误，连续错误"+(num+1)+"次（连续错误次数等于5次时，动态口令将被锁定）";

				} else if (num == 4) {
					// 这是第5次，要锁定了，还要修改控制台的锁定状态
					errMesg = "动态口令错误，连续错误5次（连续错误次数等于5次时，动态口令将被锁定） 请与国付宝客服人员联系，解锁动态口令。客服电话：400-0550-009";
					// 锁住动态口令，因为密码输错5次
					du.setPwdLockStat("1");
				}
				// 更新次数+1
				du.setTokenErrorNum(String.valueOf(num + 1));
				userDCInfoDAO.update(du);
			}

		}

		return errMesg;
	}

}
